<?php

/**
 * Classe des Atributions
 *
 * @author Alexia
 * @author Jeremy
 * @version 1.0
 */
class Attribution
{

    /**
     * @var int
     */
    protected $Id;
    /**
     * @var int
     */
    protected $IdTuteurEntreprise;
    /**
     * @var int
     */
    protected $IdStage;
    /**
     * @var int
     */
    protected $DateAjout;
    /**
     * @var boolean
     */
    public $requeteOk;
    /**
     * @var string
     */
    public $errormsg;

    /**
     *
     * @param int $id Id d'une Attribution
     */
    public function __construct($id = 0)
    {
        if (empty($id))
        {
            $this->Id = 0;
            $this->IdTuteurEntreprise = 0;
            $this->IdStage = 0;

            $this->DateAjout = 0;

            $this->requeteOk = true;
            $this->errormsg = "";
        }
        else
        {
            $sql = SQL::getInstance()->getConnection();
            //On retourne l'entree demandee
            $query = 'SELECT * FROM Attribution WHERE IdAttribution = :id';
            $c = $sql->prepare($query);
            $c->bindParam(':id', $id, PDO::PARAM_INT);
            //Execution de la requête retourne false si echec
            if ($c->execute())
            {
                $result = $c->fetch(PDO::FETCH_OBJ);
                if (!empty($result))
                {
                    //ID
                    $this->Id = $result->IdAttribution;
                    $this->IdStage = $result->IdStage;
                    $this->IdTuteurEntreprise = $result->IdEnseignant;

                    $this->DateAjout = $result->DateAjoutAttribution;

                    $this->requeteOk = true;
                    $this->errormsg = "";
                }
                else
                {
                    $this->requeteOk = false;
                    $this->errormsg = "Cette attribution n'existe pas !";
                }
            }
            else
            {
                //Recuperation de l'erreur dans la variable de classe
                /*
                  Pour chaque new avec passage de paramètres vous pouvez savoir si vous avez bien un resultat, si false n'oubliez pas de gerez l'affichage du message,...
                 */
                $this->requeteOk = false;
                $this->errormsg = $c->errorInfo();
            }
        }
    }

    /**
     * Permet l'insertion dans la bd d'une attribution
     */
    public function insertAttribution()
    {
        $sql = SQL::getInstance()->getConnection();
        $query =
                'INSERT INTO Attribution
		(
			 IdStage,
			 IdTuteurEntreprise,
                         DateAjoutAttribution
		)
		VALUES
		(
			:idS,
			:idE,
                        :dateA
		)';
        $sql->beginTransaction();
        try
        {
            $c = $sql->prepare($query);

            $c->bindParam(':idS', $this->IdStage, PDO::PARAM_INT);
            $c->bindParam(':idE', $this->IdTuteurEntreprise, PDO::PARAM_INT);

            $c->bindParam(':dateA', $this->DateAjout, PDO::PARAM_INT);

            if ($c->execute())
            {
                $this->Id = $sql->lastInsertId();
                $sql->commit();
                $c->closeCursor();
                $this->requeteOk = true;
                $this->errormsg = "Insertion reussie!";
            }
            else
            {
                $this->requeteOk = false;
                $this->errormsg = $c->errorInfo();
                $sql->rollback();
                $c->closeCursor();
                $this->Id = 0;
            }
        }
        catch (PDOException $Exception)
        {
            $this->requeteOk = false;
            $this->errormsg = $c->errorInfo();
            $sql->rollback();
            $c->closeCursor();
            $this->Id = 0;
        }
    }

    /**
     * Permet de sauvegarder une modification d'attribution dans la bd
     */
    public function updateAttribution()
    {
        $sql = SQL::getInstance()->getConnection();
        $query =
                'UPDATE Attribution SET
			 IdStage              = :idS,
			 IdTuteurEntreprise   = :idE,
                         DateAjoutAttribution = :dateA
		WHERE
			IdAttribution         = :id
		';
        $sql->beginTransaction();
        try
        {
            $c = $sql->prepare($query);

            $c->bindParam(':id', $this->Id, PDO::PARAM_INT);
            $c->bindParam(':idS', $this->IdStage, PDO::PARAM_INT);
            $c->bindParam(':idE', $this->IdTuteurEntreprise, PDO::PARAM_INT);

            $c->bindParam(':dateA', $this->DateAjout, PDO::PARAM_INT);

            if ($c->execute())
            {
                $sql->commit();
                $c->closeCursor();
                $this->requeteOk = true;
                $this->errormsg = "Modification reussie!";
            }
            else
            {
                $this->requeteOk = false;
                $this->errormsg = $c->errorInfo();
                $sql->rollback();
                $c->closeCursor();
            }
        }
        catch (PDOException $Exception)
        {
            $this->requeteOk = false;
            $this->errormsg = $c->errorInfo();
            $sql->rollback();
            $c->closeCursor();
        }
    }

    /**
     *
     * @param int $Enseignant Identifiant d'un enseignant
     * @return Object Objet representant un stage
     *
    public function getStagesbyTuteurEntreprise($value)
    {
        //Recuperation des variables globales
        global $global_dsn;
        global $global_dsnUser;
        global $global_dsnPwd;
        //Instanciation connexion PDO
        $sql = new PDO($global_dsn, $global_dsnUser, $global_dsnPwd);
        $query = 'SELECT IdStage FROM Attribution WHERE IdEnseignant = :id';
        $c = $sql->prepare($query);
        $c->bindParam(':id', $Enseignant, PDO::PARAM_INT);
        $c->execute();
        $result = $c->fetchAll(PDO::FETCH_OBJ);
        return $result;
    }*/

    /**
     *
     * @param int $stage Identifiant d'un stage
     * @return Object Objet representant un enseignant
     *
    public function getEnseignantbyStage($stage)
    {
        //Recuperation des variables globales
        global $global_dsn;
        global $global_dsnUser;
        global $global_dsnPwd;
        //Instanciation connexion PDO
        $sql = new PDO($global_dsn, $global_dsnUser, $global_dsnPwd);
        $query = 'SELECT IdEnseignant FROM Attribution WHERE IdStage = :id';
        $c = $sql->prepare($query);
        $c->bindParam(':id', $stage, PDO::PARAM_INT);
        $c->execute();
        $result = $c->fetch(PDO::FETCH_OBJ);
        return $result;
    }
    */

    /**
     * Renvoie le tuteur entreprise actuel d'un stage
     * @param int $id Id du stage
     * @return int
     */
    static public function getIdTuteurEntrepriseActuelByStage($id)
    {
        if (empty($id))
        {
            return 0;
        }
        else
        {
            $sql = SQL::getInstance()->getConnection();
            //On retourne l'entree demandee
            $query = '
                        SELECT Attribution.IdTuteurEntreprise
                        FROM Attribution
                        WHERE Attribution.DateAjoutAttribution = (  SELECT MAX(Attribution.DateAjoutAttribution)
                                                                    FROM Attribution
                                                                    WHERE Attribution.IdStage = :id)
                    ';
            $c = $sql->prepare($query);
            $c->bindParam(':id', $id, PDO::PARAM_INT);
            //Execution de la requête retourne false si echec
            if ($c->execute())
            {
                $result = $c->fetch(PDO::FETCH_OBJ);
                if (!empty($result))
                {
                    return $result->IdTuteurEntreprise;
                }
                else
                {
                    return 0;
                }
            }
            else
            {
                return 0;
            }
        }
    }

    /**
     * Renvoie l'id de l'attribution actuel d'un stage
     * @param int $id Id du stage
     * @return int
     */
    static public function getIdAttributionActuelByStage($id)
    {
        if (empty($id))
        {
            return 0;
        }
        else
        {
            $sql = SQL::getInstance()->getConnection();
            //On retourne l'entree demandee
            $query = '
                        SELECT Attribution.IdAttribution
                        FROM Attribution
                        WHERE Attribution.DateAjoutAttribution = (  SELECT MAX(Attribution.DateAjoutAttribution)
                                                                    FROM Attribution
                                                                    WHERE Attribution.IdStage = :id)
                    ';
            $c = $sql->prepare($query);
            $c->bindParam(':id', $id, PDO::PARAM_INT);
            //Execution de la requête retourne false si echec
            if ($c->execute())
            {
                $result = $c->fetch(PDO::FETCH_OBJ);
                if (!empty($result))
                {
                    return $result->IdTuteurEntreprise;
                }
                else
                {
                    return 0;
                }
            }
            else
            {
                return 0;
            }
        }
    }

    //************** Getter et Setter **********************
    /**
     * @return int
     */
    public function getIdAttribution()
    {
        return $this->Id;
    }

    /**
     * @return int
     */
    public function getIdTuteurEntreprise()
    {
        return $this->IdTuteurEntreprise;
    }

    /**
     *
     * @param int $value
     * @return Array contenant boolOk et errmsg
     */
    public function setIdTuteurEntreprise($value)
    {
        //Verif Type + verif Nulle, si bon mis a jour, sinon message erreur
        $errTab = array("boolOk" => true, "errmsg" => "");

        if (isset($value) && $value > 0)
        {
            $this->IdTuteurEntreprise = $value;
        }
        else
        {
            if (!isset($value))
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "L'Id ne peut etre null !";
            }
            if (isset($value) && $value <= 0)
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "L'Id ne peut etre <= 0 !";
            }
            else
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "Cet Id n'est pas valide !";
            }

            $this->IdTuteurEntreprise = 0;
        }
        return $errTab;
    }

    /**
     *
     * @return int
     */
    public function getIdStage()
    {
        return $this->IdStage;
    }

    /**
     *
     * @param int $value
     * @return  Array contenant boolOk et errmsg
     */
    public function setIdStage($value)
    {
        //Verif Type + verif Nulle, si bon mis a jour, sinon message erreur
        $errTab = array("boolOk" => true, "errmsg" => "");

        if (isset($value) && $value > 0)
        {
            $this->IdStage = $value;
        }
        else
        {
            if (!isset($value))
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "L'IdStage ne peut etre null !";
            }
            if (isset($value) && $value <= 0)
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "L'IdStage ne peut etre <= 0 !";
            }
            else
            {
                $errTab["boolOk"] = false;
                $errTab["errmsg"] = "Cet IdStage n'est pas valide !";
            }

            $this->IdStage = 0;
        }
        return $errTab;
    }

    public function getDateAjout()
    {
        return $this->DateAjout;
    }

    public function setDateAjout()
    {
        $this->DateAjout = time();
    }

}

?>
